//
// Description: 5. 多重背包问题 II
// Created by Loading on 2022/6/1.
//

/*
 * 数据范围到 1e3 以上时，O(n^3) 会TLE，使用二进制优化，O(n^2logn)
 * 优化思想：将每种物品的数量(s)按照二进制方式分堆，1个、2个、4个……，这样可以使用这些堆组合成0~s中的任意个
 * 将所有分堆看成新的的物品，进而转换成 01背包问题
 */

#include <bits/stdc++.h>

using namespace std;

// 注意数据范围：1000种物品，每种最多2000个，使用二进制分堆，24000堆左右
constexpr int N = 25000;

int v[N], w[N];
int dp[N];

int main() {
    int n, V;
    cin >> n >> V;
    int cnt = 0;
    for (int i = 1; i <= n; ++i) {
        int a, b, s;
        cin >> a >> b >> s;
        // 二进制优化
        int k = 1;
        while (k <= s) {
            ++cnt;
            v[cnt] = a * k;
            w[cnt] = b * k;
            s -= k;
            k *= 2;
        }

        if (s) {
            ++cnt;
            v[cnt] = a * s;
            w[cnt] = b * s;
        }
    }

    // 转换为 01背包问题
    n = cnt;
    for (int i = 1; i <= n; ++i) {
        for (int j = V; j >= v[i]; --j) {
            dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
        }
    }

    cout << dp[V] << endl;

    return 0;
}